package bs.global.web;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import bs.global.util.JsfUtil;
import bs.seguridad.modelo.ItemMenuUsuario;
import bs.seguridad.modelo.Menu;
import bs.seguridad.modelo.Usuario;
import bs.seguridad.rn.MenuRN;
import java.io.Serializable;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuItem;
import org.primefaces.model.menu.MenuModel;
import org.primefaces.model.menu.Submenu;


/**
 *
 * @author ctrosch
 */
@ManagedBean
@SessionScoped
public class PrincipalBean implements Serializable {

    private String paginaActiva = "/seguridad/login";
    private MenuModel modelo;
    private List<Menu> menuPrincipal;
    private List<Menu> resultadoBusqueda;
    private String txtBusqueda;
    
    @EJB private MenuRN menuRN;

    public PrincipalBean() {

    }

    public MenuModel getModelo() {
        
        if (modelo == null)
            modelo = new DefaultMenuModel();
        return modelo;
    }

    public void setModelo(MenuModel modelo) {
        this.modelo = modelo;
    }
    
    public String getPaginaActiva() {
        return paginaActiva;
    }

    public void setPaginaActiva(String paginaActiva) {
        this.paginaActiva = paginaActiva;
    }

    public void handlerX(ActionEvent ae) {

    }
    
    public void buscarMenuItem(){
        
        if(!txtBusqueda.isEmpty()){
            resultadoBusqueda = menuRN.getItemsByTexto(txtBusqueda);  
            
            if(resultadoBusqueda.isEmpty()){
                JsfUtil.addInfoMessage("No se encontraron resultados para \""+ txtBusqueda + "\"" );
            }
            System.err.println("encontró");
        }else{
            System.err.println("limpia");
            resultadoBusqueda.clear();
        }
    }

    public String navegar(ActionEvent ae){

        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        HttpSession session = (HttpSession) externalContext.getSession(true);

        if (session.isNew()){
            System.out.println("Session nueva");
            paginaActiva = "../seguridad/login.xhtml";
        }

        MenuItem itm = (MenuItem) ae.getSource();
        Menu menu = (Menu) itm.getValue();
//        System.out.println("valor de item = " + itm.getValue());
        paginaActiva = menu.getAccion();

        
//        System.out.println("Pagina activa: " + paginaActiva);
        //return ".."+paginaActiva+".xhtml";
        paginaActiva = "../seguridad/login.xhtml";
        return paginaActiva;
    }

    public void cargarMenu(Usuario u){

        if(u==null){
            JsfUtil.addWarningMessage("El usuario no existe");
            return;
        }

        //Traemos el menu actualizado
        u.setMenu(menuRN.getMenuByUsuario(u));

        if(u.getMenu()==null){
            JsfUtil.addWarningMessage("El usuario no tiene permisos asignados");
            return;
        }

        if(u.getMenu().isEmpty()){
            JsfUtil.addWarningMessage("El usuario no tiene permisos asignados");
            return;
        }

        modelo = new DefaultMenuModel();
        menuPrincipal = menuRN.getListaByNivel(1,true);

        if(menuPrincipal ==null){
            JsfUtil.addWarningMessage("No es posible obtener el menu del sistema");
            return;
        }
        
        //Recorremos menu principal        
        for(Menu mPrincipal: menuPrincipal){
                        
            Submenu submenu = new DefaultSubMenu(mPrincipal.getNombre());            
            submenu.setId("menu" + mPrincipal.getId());

            ItemMenuUsuario um = new ItemMenuUsuario(u.getId(), mPrincipal.getId());

            if(u.getMenu().contains(um) && mPrincipal.getActivo()){

                //Generamos el arbol
                generarArbol(submenu, u, mPrincipal.getMenuItem());
                if(submenu.getElementsCount()!=0) modelo.addElement(submenu);

            }
        }
    }

    private void generarArbol(Submenu submenu, Usuario u, List<Menu> items){

        //Si el items está vacío no hace nada
        if (items.isEmpty()){
            return;
        }

        //Recorremos menu principal
        for(Menu m: items){

            if(!m.getActivo()){
                continue;
            }

            ItemMenuUsuario um = new ItemMenuUsuario(u.getId(), m.getId());

            //Si no tiene hijos creamos el item
            if(m.getMenuItem().isEmpty()){
                
                if(u.getMenu().contains(um)){

//                    System.out.println("Usuario : " + u.getUsuario() + "- Item Menu: "+ m.getNombre());

                    MenuItem item = new DefaultMenuItem(m.getNombre());

                    item.setId("Item" + m.getId());
                    
                    item.setParam("url", ".."+m.getUrl()+".jsf");
                    item.setParam("param","_blank");

                    switch (m.getTipo()){

                        //Registración
                        case 1:
                            item.setParam("icon","form16");
                            break;
                        //Informes
                        case 2:
                            item.setParam("icon","report24");
                            break;
                        //Configuracion
                        case 3:
                            item.setParam("icon","config16");
                            break;
                         //Impresiones
                        case 4:
                            item.setParam("icon","print16");
                            break;

                        default:
                            item.setParam("icon","disk00");
                            break;
                    }

//                    if(m.getNivel()==2) item.setIcon("disk00");
//                    if(m.getNivel()==3) item.setIcon("disk00");
//                    if(m.getNivel()==4) item.setIcon("disk01");
                    
                    submenu.getElements().add(item);
                }
                
            }else{

                if(u.getMenu().contains(um)){
                    
//                    System.out.println("Usuario : " + u.getUsuario() + "- Sub Menu: "+ m.getNombre());

                    //Si tiene hijos seguimos cargando el submenu
                    Submenu submenu1 = new DefaultSubMenu(m.getNombre());

                    submenu1.setId("Item" + m.getId());                    
                    generarArbol(submenu1, u, m.getMenuItem());

                    submenu.getElements().add(submenu1);
                    //Si el menu no tiene item, entonces no lo agregamos

                    

                  }
            }            
        }
    }


    private void generarMenu(Submenu submenu, Menu menuItem){

        if(menuItem.getMenuItem().isEmpty()){

            MenuItem item = new DefaultMenuItem(menuItem.getNombre());
            item.setParam("url", ".."+menuItem.getUrl()+".jsf");
            item.setParam("target", "_blank");
            
            if(menuItem.getNivel()==3) item.setParam("icon","disk00");
            if(menuItem.getNivel()==4) item.setParam("icon","disk01");
            /**
            FacesContext context = FacesContext.getCurrentInstance();
            MethodExpression actionListener = context.getApplication().getExpressionFactory().createMethodExpression(
                    context.getELContext(),
                    "#{navegadorMB.navegar}",
                    null,
                    new Class[] { ActionEvent.class });
            item.addActionListener(new MethodExpressionActionListener(actionListener));
             * */
            item.setId("Item" + menuItem.getId());

            submenu.getElements().add(item);
                    
            //System.out.println("Se agrega Item: "+ menuItem.getNombre());
        }else{
            Submenu submenu1 = new DefaultSubMenu(menuItem.getNombre());            
            submenu1.setId("Item" + menuItem.getId());

            for(Menu item: menuItem.getMenuItem()){

                if(item.getActivo()){
                    generarMenu(submenu1, item);
                }
            }


            //Si el menu no tiene item, entonces no lo agregamos
            if(submenu1.getElementsCount()!=0) submenu.getElements().add(submenu1);
        }
    }

    public List<Menu> getMenuPrincipal() {
        return menuPrincipal;
    }

    public void setMenuPrincipal(List<Menu> menuPrincipal) {
        this.menuPrincipal = menuPrincipal;
    }

    public String getTxtBusqueda() {
        return txtBusqueda;
    }

    public void setTxtBusqueda(String txtBusqueda) {
        this.txtBusqueda = txtBusqueda;
    }
    
    public List<Menu> getResultadoBusqueda() {
        return resultadoBusqueda;
    }

    public void setResultadoBusqueda(List<Menu> resultadoBusqueda) {
        this.resultadoBusqueda = resultadoBusqueda;
    }
    
}

